package com.hsurosy.hsuchain.nft.datasource.sharding.alogorithm;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;
import java.util.HashSet;
import java.util.Properties;

/**
 * 基于 Hint 的自定义分片算法
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-04 19:14
 * @Description
 * @Version: v1.0.0
 */
public class TurboHintShardingAlgorithm implements HintShardingAlgorithm<String> {

    // 属性配置
    private Properties props;

    // 日志记录器
    private static final Logger LOG = LoggerFactory.getLogger(TurboHintShardingAlgorithm.class);

    /**
     * 根据 Hint 值进行分片
     *
     * @param collection       数据库或表的集合，即所有可选的分片表
     * @param hintShardingValue 包含了 Hint 分片的逻辑表名及其分片键的值
     * @return 返回匹配的目标分片表集合
     */
    @Override
    public Collection<String> doSharding(Collection<String> collection, HintShardingValue<String> hintShardingValue) {
        // 获取逻辑表名
        String logicTableName = hintShardingValue.getLogicTableName();

        // 获取 Hint 中的目标分片键值集合
        Collection<String> shardingTargets = hintShardingValue.getValues();

        // 定义一个集合来存储匹配的表
        Collection<String> matchedTables = new HashSet<>();

        // 将每个分片键值拼接为逻辑表的目标分片表名
        for (String shardingTarget : shardingTargets) {
            matchedTables.add(logicTableName + "_" + shardingTarget);
        }

        // 输出日志，记录匹配的表信息
        LOG.info("matchedTables : " + matchedTables);

        // 返回与可选集合的交集，即筛选出存在的目标表
        return CollectionUtils.intersection(collection, matchedTables);
    }

    /**
     * 获取当前的属性配置
     * @return 返回属性对象
     */
    @Override
    public Properties getProps() {
        return props;
    }

    /**
     * 初始化方法，用于加载属性配置
     * @param props 外部传入的属性配置
     */
    @Override
    public void init(Properties props) {
        this.props = props;
    }
}
